package test;

import base.factory.impl.RegItemFactory;
import base.list.FatSingleton;
import base.entity.regitem.RegItem;
import base.list.SrcDirRegItemsSingleton;
import base.util.ByteFileIOUtils;
import base.util.XMLUtils;



import java.io.File;

/**
 * @Author: x1aolone
 * @Date: 2019/9/26 16:22
 */
public class start {

    // 使用相对路径来创建文件，java.io默认定位到当前用户目录("user.dir")下，即工程根目录
    // 相对路径的起始处无斜杆"/"
    public static File file = new File(XMLUtils.getFilePath("disk"));


    void test () {
        FatSingleton.INSTANCE.set(12, Byte.MAX_VALUE+1);
    }

    public static void main(String args[]) {
        Prepare();
        Show();
//        System.out.print("艹");
    }




    /**
     * 初始化disk.txt
     * 具体操作：为Fat.fat和SourceDirRegItemList.regItems创建对象，并写入数据
     * 并为文件写入Fat.fat、SourceDirRegItemList.regItems以及125*64个(byte)0
     */
    public static void Prepare () {
        // 1.准备fat内容并写入文件
//        for (int i = 0; i < Fat.SINGLETON.size(); i++) {
//            if (i<=2) {
//                Fat.SINGLETON.set(i, -1);
//            } else {
//                Fat.SINGLETON.set(i, 0);
//            }
//        }
        // 下面的for是测试用的
        for (int i = 0; i < FatSingleton.INSTANCE.size(); i++) {
            FatSingleton.INSTANCE.set(i, FatSingleton.INSTANCE.size() - 1 - i);
        }

        FatSingleton.INSTANCE.writeIntoFile();

        // 2.准备根目录内容并写入文件
//        for (int i = 0; i < SourceDirRegItemList.SINGLETON.size(); i++) {
//            SourceDirRegItemList.SINGLETON.set(i, null);
//        }
        // 下面的for是测试用的
        for (int i = 0; i < SrcDirRegItemsSingleton.INSTANCE.size(); i++) {
            RegItem r;
            byte a = (byte)i;
            if (i % 4 == 0) {
                // 4的倍数，建立目录登记项，length为0
                r = RegItemFactory.getInstance().newDirInstance(""+a+a+a, a, a);
            } else if (i % 2 == 0) {
                // 2的倍数，建立文件登记项，length不为0
                r = RegItemFactory.getInstance().newFileInstance(""+a+a+a,""+a+a, a, a, a);
            } else {
                // 奇数项填充空白
                r = null;
            }
            SrcDirRegItemsSingleton.INSTANCE.set(i, r);
        }

        // 根目录写入文件
        SrcDirRegItemsSingleton.INSTANCE.writeIntoFile();

        // 3.准备剩余磁盘容量的填充，并写入文件
        // 剩余125块盘块，一个盘块64个字节，全部填充0，需要125*64个0
//        for (int i = 3; i < 128; i++) {
//            DiskIOUtils.write(DiskIOUtils.FILLED_64BYTES_ZERO_ARRAY, i*64);
//        }
        // 下面的for是测试用的
        for (int i = 3; i < 128; i++) {
            byte[] bytes = new byte[64];
            for (int j = 0; j < 64; j++) {
                bytes[j] = (byte)i;
            }

            ByteFileIOUtils.write(file, bytes, i*64);
        }

    }

    public static void Show() {
        // 1.展示Fat的内容
        System.out.println("Fat的内容为：");
        for (int i = 0; i < FatSingleton.INSTANCE.size(); i++) {
            System.out.println(i + "\t" + FatSingleton.INSTANCE.get(i));
        }
        // 2.展示根目录的内容
        for (int i = 0; i < SrcDirRegItemsSingleton.INSTANCE.size(); i++) {
            RegItem r = SrcDirRegItemsSingleton.INSTANCE.get(i);
            if (r != null) {
                StringBuilder outContent = new StringBuilder("根目录第").append(i).append("个登记项的内容为：");
                System.out.print(outContent.toString());
                System.out.println(r);
            } else {
                StringBuilder outContent = new StringBuilder("根目录第").append(i).append("个登记项的内容为空，全是填充的0：");
                System.out.print(outContent.toString());
                System.out.println(r);
            }
        }
        // 3.展示剩余盘块的内容，剩余的125块盘块，一个盘块64个字节，跳过Fat的128个字节和根目录的64个字节后开始读取
        byte[] fill = ByteFileIOUtils.read(file, 125*64, 3*64);
        for (int i = 0, j = 3; i < fill.length; i++) {
            if (i % 64 == 0) {
                System.out.println();
                StringBuilder tipContent = new StringBuilder("第").append(j).append("个盘块的内容为：") ;
                System.out.println(tipContent.toString());
                j++;
            }
            System.out.print(fill[i] + " ");
        }
    }

}